// 页面路径：store/index.js 
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);//vue的插件机制

//Vuex.Store 构造器选项
const store = new Vuex.Store({
  state: {

    cartList: uni.getStorageSync("cartList") || [],
    // 收货地址 {data,time}
    storageAddress: uni.getStorageSync("storageAddress"),
    // 用户凭据
    token: ""
  },
  getters: {

    // 获取真正的收货地址 data
    address(state) {
      /* 
      1 判断有没有收货地址 缓存 
      2 没有缓存 返回null 
      3 如果有缓存
        1 而且 时间  没有过期 返回 真正收货地址
        2 时间过期了 返回null 

      4 返回真实地址的情况
        1 缓存存在 而且不过期 就返回 真实数据
        2 其他 不管它
       */

      // if (state.storageAddress) {
      //   // 有缓存 -> 判断过期时间  5分钟

      //   if (Date.now() - state.storageAddress.time > 1000 * 60 * 5) {
      //     // 过期
      //     return null 
      //   } else {
      //     // 没有过期 返回真正地址
      //     return state.storageAddress.data;
      //   }

      // } else {
      //   // 没有缓存 返回 null
      //   return null;
      // }
      if (state.storageAddress && (Date.now() - state.storageAddress.time <= 1000 * 60 * 5)) {
        // 有缓存 而且没有过期
        return state.storageAddress.data;
      }

    },


    // 用户选中的商品数组
    checkedCartList(state) {
      return state.cartList.filter(goods => goods.checked);
    },
    // 总价格
    totalPrice(state, getters) {
      // 要的选中的商品的总价格！！  checkedCartList 就是过滤后选中的数组
      return getters.checkedCartList.reduce((sum, goods) => sum += goods.goods_price * goods.num, 0);
    },
    // 购买总数量 
    totalCount(state, getters) {
      return getters.checkedCartList.reduce((sum, goods) => sum += goods.num, 0);
    },
    // 判断是否要全选
    isAllChecked(state, getters) {
      return (
        // 空数组 使用every方法 返回值 true！！！
        state.cartList.length && state.cartList.every((goods) => goods.checked)
      );
    },
  },
  // 修改state mutations
  mutations: {
    // 添加数据到购物车
    setCartList(state, cartList) {
      state.cartList = cartList
      uni.setStorageSync("cartList", state.cartList);
    },
    // 添加收货地址
    setAddress(state, address) {
      state.storageAddress = { data: address, time: Date.now() };
      // 存一份到缓存中
      uni.setStorageSync("storageAddress", state.storageAddress)
    },
    // 设置token
    setToken(state, token) {
      state.token = token;
    }
  },
  actions: {
    // 获取token 异步
    async fetchToken(store) {
      const [err1, { encryptedData, rawData, iv, signature }] =
        await uni.getUserProfile({
          desc: "用于给用户提供刚好体验",
        });

      const [err2, { code }] = await uni.login();

      // 拼接参数 获取token
      const tokenParams = {
        encryptedData,
        rawData,
        iv,
        signature,
        code,
      };

      // 发post请求 获取token  点两次按钮原因是因为 后端程序有bug 还没有修复！！！
      // 改为 uni
      const res3 = await uni.$u.post("/users/wxlogin", tokenParams);

      // 获取token
      const { token } = res3.message;

      store.commit("setToken", token);

      // return token;

    }
  }
})
export default store